#include "widget.h"
#include "ui_widget.h"
#include <QPoint>
#include <QDebug>
#include <QPainter>


Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

//绘图函数：
void Widget::paintEvent(QPaintEvent* e)
{
    QPainter painter(this);

    //QRect的一种构造方式：
    QRect rect(0,0,40,40);

    //填充矩形函数：
    painter.fillRect(rect,QColor(0,0,0));
}

void Widget::on_pushButton_clicked()
{
    /*
    //点：
    QPoint pt(20,20);
    qDebug()<<pt<<endl;

    if(true == pt.isNull())
    {
        qDebug()<<"yes"<<endl;
    }
    else
    {
        qDebug()<<"no"<<endl;
    }

    pt.setX(300);
    pt.setY(300);

    qDebug()<<pt.x()<<" "<<pt.y()<<endl;

    //在Point对象中，x和y都是private成员，不能够直接访问修改，还可以用rx()函数来修改，他的返回类型是Point&类型可以改的就是他的成员
    pt.rx()++;
    pt.ry()++;
    qDebug()<<pt.x()<<pt.y()<<endl;


    QPoint pt1(2,3),pt2(4,8);
    qDebug()<<pt1 + pt2<<endl;
    qDebug()<<pt2 - pt1<<endl;
    qDebug()<<pt1 * 3<<endl;
    qDebug()<<pt2 / 2<<endl;


    //QRect区域：
        //QRect的成员变量必须都是整数；
    QRect qr(QPoint(30,40),QPoint(60,60));
    qDebug()<<qr<<endl;     //QRect(30,40 31x21)         输出的是起始坐标，和长度和宽度；长度和宽度有问题，历史遗留问题；
    qDebug()<<qr.x()<<" "<<qr.y();

    qDebug()<<"左上>"<<qr.left()<<" "<<qr.top();
    qDebug()<<"右下>"<<qr.right()<<" "<<qr.bottom();
    //但是因为历史遗留问题，所得到的右下的坐标起始是有问题的，要求到真实的坐标就要起始坐标加上长度和宽度：
    qDebug()<<qr.x() + qr.width();
    qDebug()<<qr.y() + qr.height();


    //得到弹出窗口的大小：
    QRect ret = rect();
    qDebug()<<ret<<endl;    //QRect(0,0 340x275)    窗口的起始位置，窗口的长度和宽度；       注意：该坐标是基于窗口为坐标系的坐标；
    //该窗口的大小不包括  状态栏和边框的大小，纯纯就是弹窗的大小（客户区）；客户区的大小
            //客户区和非客户区的关系：整个窗口是非客户区，而客户区存在非客户区的上面；  所以非客户区就比客户区大；
    //得到弹出窗口的大小（包括上面状态栏的大小） （非客户区的大小）：
    ret = frameGeometry();
    qDebug()<<ret<<endl;    //QRect(1089,608 342x328)   窗口的起始位置，窗口的长度和宽度    注意：该坐标是基于桌面为坐标系的坐标
    qDebug()<<frameSize();  //QSize(342, 328)       整个窗口软件（非客户区）的长度和宽度

    //得到QRect矩形区的中心点：
    QPoint centerPt = ret.center();
    qDebug()<<centerPt<<endl;   //QPoint(1259,771)  那么这个中心点的坐标系是基于桌面的了；

    //isEmpty():        这个函数的判断定则就是     右下的坐标不能比左上的坐标小，不然就不是矩形了；
    QRect rect2(40,40,200,200);
    if(!rect2.isEmpty())
    {
        qDebug()<<"为 Empty"<<endl;
    }
    //isNull() :            这个函数的判断定则是         组成矩形的长度和宽度每个都不能为0；
    if(rect2.isNull())
    {
        qDebug()<<"为 Null"<<endl;
    }

    //移动：
    rect2.moveLeft(20);     //水平左移；影响左上角坐标，不影响长度和宽度；
    qDebug()<<rect2<<endl;

    //判断一个点在不在矩形区域内：
    QPoint point2(50,50);
    if(true == rect2.contains(point2))
        qDebug()<<"在"<<endl;
    else
        qDebug()<<"不在"<<endl;


    //QSize:
    QSize size(30,30);
    size = frameSize();
    qDebug()<<size<<endl;
    */

    /*
    QList<int> list;
    for(int i = 0;i<5;i++)
    {
        // c方式插入：
        //list<<i;
        //cpp方式插入：
        list.append(i + 1);
    }
    list.insert(2,666);
    list.prepend(00);
    //遍历：
    for(int i = 0;i<list.size();i++)
        qDebug()<<list[i];

    //替换：
    list.replace(2,777);        //把链表中的那个数值改为哪个数值；
    qDebug()<<list<<endl;

    //交换：
    list.swap(3,6);
    qDebug()<<list<<endl;

    //包含：
    if(true == list.contains(666))
        qDebug()<<"包含啦"<<endl;
    else
        qDebug()<<"哪都没有"<<endl;

    //查找：
    int pos = list.indexOf(666);
    qDebug()<<pos<<endl;

    //移除：
    list.removeAt(0);   //移除第几个；
    for(int i = 0;i<list.size();i++)
        qDebug()<<list[i];


    //字符串链表：
    QList<QString>list2;
    list2.push_back("lifei");
    list2.push_back("liqiongyi");
    list2.push_back("niubi");
    qDebug()<<list2<<endl;
    */


    //QMap:
    QMap<QString,int> map;
    map["One"] = 1;
    map["Two"] = 2;

    qDebug()<<map["One"];

    map.insert("Three",3);

    //遍历：
        //使用迭代器：
    QMap<QString,int>::iterator it = map.begin();
    while(it != map.end())
    {
        qDebug()<<it.key()<<"-"<<it.value();
        it++;
    }


}

void Widget::on_pushButton_2_clicked()
{
    //判断控件是否可见或隐藏的函数：isVisibleTo();
    if(true == isVisibleTo(ui->pushButton))
        qDebug()<<"可见"<<endl;
    else
        qDebug()<<"隐藏"<<endl;

    //让窗口隐藏函数：
    //hide();

    //可以让该按钮控件隐藏：
    //ui->pushButton_2->hide();

    //如果可见就隐藏；如果隐藏就是可见：
    if(ui->pushButton->isVisible())
        ui->pushButton->hide();
    else
        ui->pushButton->show();
//    //or    另一种写法：
//    ui->pushButton->setVisible(true);
//    //or
//    ui->pushButton->setHidden(false);


}

void Widget::on_pushButton_3_clicked()
{
    //按钮控件显示函数：
    //ui->pushButton_2->show();

//    QWidget* w = ui->pushButton_2->window();
//    qDebug()<<w<<endl;

//    QWidget* w = window();
//    qDebug()<<w<<endl;
//    qDebug()<<this<<endl;

    //设置窗口标题：
    setWindowTitle("lifei");
}

void Widget::on_pushButton_4_clicked()
{
    //获取窗口标题：
    QString title = windowTitle();
    qDebug()<<title<<endl;

    //设置按钮控件的标题：
    ui->pushButton_4->setText("heihei");
}

//几何坐标
void Widget::on_pushButton_5_clicked()
{
    //获取客户区的基于桌面坐标系的坐标，和窗口的大小：
    QRect qr = geometry();
    qDebug()<<qr<<endl;

    //获取非客户区（包括边框的）的坐标和大小：
    QRect frameRt = frameGeometry();
    qDebug()<<frameRt<<endl;

    //获取非客户区（包括边框的）的大小：
    QSize size1 = frameSize();
    qDebug()<<size1<<endl;

    //获取客户区的大小：
    QSize size2 = size();
    qDebug()<<size2<<endl;

    //获取窗口（非客户区）的顶点坐标：
    QPoint pt = pos();
    qDebug()<<pt<<endl;
    //or
    int x1 = x();
    int y1 = y();
    qDebug()<<"x:"<<x1<<" "<<"y:"<<y1<<endl;

    //那这个获取的就是客户区的长度和宽度了：
    int w = width();
    int h = height();
    qDebug()<<"width:"<<w<<" height:"<<h<<endl;

    //获取按钮控件的宽度和长度：
    int wkong = ui->pushButton_5->width();
    int hkong  = ui->pushButton_6->height();
    qDebug()<<"w:"<<wkong<<" h:"<<hkong<<endl;

    //获取按钮控件的大小：
    QRect rectkong = ui->pushButton_5->geometry();
    qDebug()<<rectkong<<endl;

    //获取客户区的区域大小：
    QRect rett = rect();
    qDebug()<<rett<<endl;

}

//移动：
void Widget::on_pushButton_6_clicked()
{
    //将软件窗口移动的基于桌面坐标系指定的坐标上：
    //move(20,20);

    //修改软件窗口的大小：
    //resize(300,300);

    //移动按钮控件的位置（基于客户区坐标系的坐标）：
    ui->pushButton_6->move(20,20);
}

void Widget::on_pushButton_7_clicked()
{
    //如果不是最大化，就最大化， 如果是最大化，就恢复窗口大小：
    if(true == isMaximized())
        showNormal();       //恢复原来窗口
    else
        showMaximized();
}

void Widget::on_pushButton_8_clicked()
{
    //该 全屏函数不包含任务栏：
    //showFullScreen();
}

void Widget::on_pushButton_9_clicked()
{
    if(ui->pushButton->isEnabled())
        ui->pushButton->setEnabled(false);
    else
        ui->pushButton->setEnabled(true);
}

//焦点：
void Widget::on_pushButton_10_clicked()
{
    //设置焦点：
    //ui->lineEdit->setFocus();
    //重置焦点：
    //ui->lineEdit->clearFocus();

    QWidget* widget = focusWidget();
    qDebug()<<widget;

}
